package br.com.toscano.gobra.view;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

import javax.faces.model.SelectItem;
import javax.inject.Inject;

import org.primefaces.event.FileUploadEvent;

import br.com.toscano.gobra.business.TabelaPrecoBC;
import br.com.toscano.gobra.business.UnidadeMedidaBC;
import br.com.toscano.gobra.domain.ItemTabelaPreco;
import br.com.toscano.gobra.domain.TabelaPreco;
import br.com.toscano.gobra.domain.UnidadeMedida;
import br.gov.frameworkdemoiselle.annotation.PreviousView;
import br.gov.frameworkdemoiselle.message.MessageContext;
import br.gov.frameworkdemoiselle.stereotype.ViewController;
import br.gov.frameworkdemoiselle.template.AbstractEditPageBean;
import br.gov.frameworkdemoiselle.transaction.Transactional;
import br.gov.frameworkdemoiselle.util.ResourceBundle;

@ViewController
@PreviousView("./tabelaPreco_list.jsf")
public class TabelaPrecoEditMB extends AbstractEditPageBean<TabelaPreco, Long> {

	private static final long serialVersionUID = 1L;

	@Inject
	private TabelaPrecoBC tabelaPrecoBC;

	private String codigoItem;
	private String descricaoItem;
	private BigDecimal valorItem;
	private Long unidadeMedidaItem;
	private List<SelectItem> unidadeMedidas;
	private Integer posicao;
	
	@Inject
	private UnidadeMedidaBC unidadeMedidaBC;

	@Inject
	private ResourceBundle bundle;

	@Inject
	private MessageContext messageContext;

	@Override
	@Transactional
	public String delete() {
		this.tabelaPrecoBC.delete(getId());
		return getPreviousView();
	}
	
	@Override
	@Transactional
	public String insert() {
		this.tabelaPrecoBC.insert(getBean());
		return getPreviousView();
	}
	
	@Override
	@Transactional
	public String update() {
		this.tabelaPrecoBC.update(getBean());
		return getPreviousView();
	}
	


	@Override
	protected TabelaPreco handleLoad(Long id) {
		setBean(this.tabelaPrecoBC.load(id));
		return getBean();
	}

	
	public String getCodigoItem() {
		return codigoItem;
	}

	public void setCodigoItem(String codigoItem) {
		this.codigoItem = codigoItem;
	}

	public String getDescricaoItem() {
		return descricaoItem;
	}

	public void setDescricaoItem(String descricaoItem) {
		this.descricaoItem = descricaoItem;
	}

	public BigDecimal getValorItem() {
		return valorItem;
	}

	public void setValorItem(BigDecimal valorItem) {
		this.valorItem = valorItem;
	}

	public Long getUnidadeMedidaItem() {
		return unidadeMedidaItem;
	}

	public void setUnidadeMedidaItem(Long unidadeMedidaItem) {
		this.unidadeMedidaItem = unidadeMedidaItem;
	}

	public List<SelectItem> getUnidadeMedidas() {
		unidadeMedidas = new ArrayList<SelectItem>();
		List<UnidadeMedida> lista = unidadeMedidaBC.findAll();
		for (UnidadeMedida te: lista) {
			unidadeMedidas.add(new SelectItem(te.getId(), te.getDescricao()));
		}
		return unidadeMedidas;
	}

	public void setUnidadeMedidas(List<SelectItem> unidadeMedidas) {
		this.unidadeMedidas = unidadeMedidas;
	}
	
	public Integer getPosicao() {
		return posicao;
	}

	public void setPosicao(Integer posicao) {
		this.posicao = posicao;
	}

	public void adicionarItem() {
		ItemTabelaPreco item = new ItemTabelaPreco();
		item.setCodigo(this.getCodigoItem());
		item.setTabelaPreco(this.getBean());
		item.setDescricao(this.getDescricaoItem());
		item.setValorUnitario(this.getValorItem());
		item.setUnidade( this.unidadeMedidaBC.load(this.getUnidadeMedidaItem()));
		if (this.getBean().getListaItemTabelaPrecos() == null) {
			this.getBean().setListaItemTabelaPrecos(new ArrayList<ItemTabelaPreco>());
		}
		this.getBean().getListaItemTabelaPrecos().add(item);

		this.setCodigoItem(null);
		this.setDescricaoItem(null);
		this.setValorItem(null);
		this.setUnidadeMedidaItem(null);
	}

	public void removerItem() {
		if (this.posicao != null) {
			this.getBean().getListaItemTabelaPrecos().remove(this.posicao.intValue());
		}
	}
	
	
	public void handleFileUpload(FileUploadEvent event) {
		
		String conteudo = new String(event.getFile().getContents());
		String[]lines = conteudo.split(System.getProperty("line.separator"));
		boolean primeira = false;
		for(String linha : lines){
			if (primeira) {
				primeira = false;
				this.getBean().setDescricao(linha);
			} else {
				StringTokenizer st = new StringTokenizer(linha, ";");
				String codigo = st.nextToken();
				String descricao = st.nextToken();
				String unidadeMedida = st.nextToken();
				String valor = st.nextToken();
				valor = valor.replace(".", "").replace(",", ".");
				
				ItemTabelaPreco item = new ItemTabelaPreco();
				item.setCodigo(codigo);
				item.setTabelaPreco(this.getBean());
				item.setDescricao(descricao);
				item.setValorUnitario(new BigDecimal(valor));
				item.setUnidade(this.unidadeMedidaBC.consultarPorDescricao(unidadeMedida));
				if (item.getUnidade() == null) {
					UnidadeMedida um =new UnidadeMedida();
					um.setDescricao(unidadeMedida);
					um.setSigla(unidadeMedida);
					item.setUnidade(this.unidadeMedidaBC.insert(um));
				}

				if (this.getBean().getListaItemTabelaPrecos() == null) {
					this.getBean().setListaItemTabelaPrecos(new ArrayList<ItemTabelaPreco>());
				}
				this.getBean().getListaItemTabelaPrecos().add(item);
			}
		}
	}
	
}